

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Perception Pipeline Tutorial &mdash; moveit_tutorials Kinetic documentation</title>
  

  
  
    <link rel="shortcut icon" href="../../_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../../_static/override.css" type="text/css" />
  

  
    <link rel="top" title="moveit_tutorials Kinetic documentation" href="../../index.html"/>
        <link rel="next" title="IKFast Kinematics Solver" href="../ikfast/ikfast_tutorial.html"/>
        <link rel="prev" title="Low Level Controllers" href="../controller_configuration/controller_configuration_tutorial.html"/> 

  
  <script src="../../_static/js/modernizr.min.js"></script>

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-108532843-1"></script>
  <script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'UA-108532843-1');
  </script>

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        <a href="../../index.html">
          <img src="../../_static/logo.png"/>
          <span>Planning Framework</span>
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <ul>
<li class="toctree-l1"><a class="reference internal" href="../getting_started/getting_started.html">Getting Started</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#install-ros-and-catkin">Install ROS and Catkin</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#install-moveit">Install MoveIt!</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#create-a-catkin-workspace">Create A Catkin Workspace</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#download-the-example-code">Download the Example Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#build-your-catkin-workspace">Build your Catkin Workspace</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting_started/getting_started.html#next-step">Next Step</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html">MoveIt! Quickstart in RViz</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#step-1-launch-the-demo-and-configure-the-plugin">Step 1: Launch the Demo and Configure the Plugin</a></li>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#step-2-play-with-the-visualized-robots">Step 2: Play with the Visualized Robots</a></li>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#step-3-interact-with-the-panda">Step 3: Interact with the Panda</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#moving-into-collision">Moving into collision</a></li>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#moving-out-of-reachable-workspace">Moving out of Reachable Workspace</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#step-4-use-motion-planning-with-the-panda">Step 4: Use Motion Planning with the Panda</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#introspecting-trajectory-waypoints">Introspecting Trajectory Waypoints</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#next-steps">Next Steps</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#rviz-visual-tools">RViz Visual Tools</a></li>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#saving-your-configuration">Saving Your Configuration</a></li>
<li class="toctree-l3"><a class="reference internal" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html#next-tutorials">Next Tutorials</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html">Move Group C++ Interface</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#running-the-code">Running the Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#setup">Setup</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#visualization">Visualization</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#getting-basic-information">Getting Basic Information</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#start-the-demo">Start the demo</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#planning-to-a-pose-goal">Planning to a Pose goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#visualizing-plans">Visualizing plans</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#moving-to-a-pose-goal">Moving to a pose goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#planning-to-a-joint-space-goal">Planning to a joint-space goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#planning-with-path-constraints">Planning with Path Constraints</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#cartesian-paths">Cartesian Paths</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#adding-removing-objects-and-attaching-detaching-objects">Adding/Removing Objects and Attaching/Detaching Objects</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_interface/move_group_interface_tutorial.html#the-launch-file">The Launch File</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html">Move Group Python Interface</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#start-rviz-and-movegroup-node">Start RViz and MoveGroup node</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#getting-basic-information">Getting Basic Information</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#planning-to-a-joint-goal">Planning to a Joint Goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#planning-to-a-pose-goal">Planning to a Pose Goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#cartesian-paths">Cartesian Paths</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#displaying-a-trajectory">Displaying a Trajectory</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#executing-a-plan">Executing a Plan</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#adding-objects-to-the-planning-scene">Adding Objects to the Planning Scene</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#ensuring-collision-updates-are-receieved">Ensuring Collision Updates Are Receieved</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#attaching-objects-to-the-robot">Attaching Objects to the Robot</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#detaching-objects-from-the-robot">Detaching Objects from the Robot</a></li>
<li class="toctree-l3"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#removing-objects-from-the-planning-scene">Removing Objects from the Planning Scene</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../move_group_python_interface/move_group_python_interface_tutorial.html#the-launch-file">The Launch File</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../moveit_commander_scripting/moveit_commander_scripting_tutorial.html">MoveIt! Commander Scripting</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../moveit_commander_scripting/moveit_commander_scripting_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../moveit_commander_scripting/moveit_commander_scripting_tutorial.html#starting-rviz-and-the-command-line-tool">Starting RViz and the Command Line Tool</a></li>
<li class="toctree-l2"><a class="reference internal" href="../moveit_commander_scripting/moveit_commander_scripting_tutorial.html#using-the-moveit-commander-command-line-tool">Using the MoveIt! Commander Command Line Tool</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html">Robot Model and Robot State</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#the-robotmodel-and-robotstate-classes">The RobotModel and RobotState Classes</a></li>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#running-the-code">Running the Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#start">Start</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#get-joint-values">Get Joint Values</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#joint-limits">Joint Limits</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#forward-kinematics">Forward Kinematics</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#inverse-kinematics">Inverse Kinematics</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#get-the-jacobian">Get the Jacobian</a></li>
<li class="toctree-l3"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#the-launch-file">The Launch File</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../robot_model_and_robot_state/robot_model_and_robot_state_tutorial.html#debugging-the-robot-state">Debugging the Robot State</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html">Planning Scene</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#the-entire-code">The entire code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#setup">Setup</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#collision-checking">Collision Checking</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#self-collision-checking">Self-collision checking</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#change-the-state">Change the state</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#checking-for-a-group">Checking for a group</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#getting-contact-information">Getting Contact Information</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#modifying-the-allowed-collision-matrix">Modifying the Allowed Collision Matrix</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#full-collision-checking">Full Collision Checking</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#constraint-checking">Constraint Checking</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#checking-kinematic-constraints">Checking Kinematic Constraints</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#user-defined-constraints">User-defined constraints</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#the-launch-file">The launch file</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#running-the-code">Running the code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene/planning_scene_tutorial.html#expected-output">Expected Output</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html">Planning Scene ROS API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#running-the-code">Running the code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#the-entire-code">The entire code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#visualization">Visualization</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#ros-api">ROS API</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#advertise-the-required-topic">Advertise the required topic</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#define-the-attached-object-message">Define the attached object message</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#add-an-object-into-the-environment">Add an object into the environment</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#interlude-synchronous-vs-asynchronous-updates">Interlude: Synchronous vs Asynchronous updates</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#attach-an-object-to-the-robot">Attach an object to the robot</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#detach-an-object-from-the-robot">Detach an object from the robot</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#remove-the-object-from-the-collision-world">Remove the object from the collision world</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#the-launch-file">The launch file</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_scene_ros_api/planning_scene_ros_api_tutorial.html#debugging-the-planning-scene-monitor">Debugging the Planning Scene Monitor</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html">Motion Planning API</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#running-the-demo">Running the Demo</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#start">Start</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#visualization">Visualization</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#pose-goal">Pose Goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#visualize-the-result">Visualize the result</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#joint-space-goals">Joint Space Goals</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#adding-path-constraints">Adding Path Constraints</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_api/motion_planning_api_tutorial.html#the-launch-file">The Launch File</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html">Motion Planning Pipeline</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#running-the-code">Running the Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#expected-output">Expected Output</a></li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#start">Start</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#visualization">Visualization</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#pose-goal">Pose Goal</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#visualize-the-result">Visualize the result</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#joint-space-goals">Joint Space Goals</a></li>
<li class="toctree-l3"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#using-a-planning-request-adapter">Using a Planning Request Adapter</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../motion_planning_pipeline/motion_planning_pipeline_tutorial.html#the-launch-file">The Launch File</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html">Visualizing Collisions</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#running-the-code">Running the Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#classes">Classes</a></li>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#interacting">Interacting</a></li>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#relevant-code">Relevant Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#initializing-the-planning-scene-and-markers">Initializing the Planning Scene and Markers</a></li>
<li class="toctree-l3"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#collision-requests">Collision Requests</a></li>
<li class="toctree-l3"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#checking-for-collisions">Checking for Collisions</a></li>
<li class="toctree-l3"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#displaying-collision-contact-points">Displaying Collision Contact Points</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../visualizing_collisions/visualizing_collisions_tutorial.html#launch-file">Launch file</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../time_parameterization/time_parameterization_tutorial.html">Time Parameterization</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../time_parameterization/time_parameterization_tutorial.html#speed-control">Speed Control</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../time_parameterization/time_parameterization_tutorial.html#from-file">From File</a></li>
<li class="toctree-l3"><a class="reference internal" href="../time_parameterization/time_parameterization_tutorial.html#during-runtime">During Runtime</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../time_parameterization/time_parameterization_tutorial.html#time-parameterization-algorithms">Time Parameterization Algorithms</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html">Planning with Approximated Constraint Manifolds</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#creating-the-constraint-database">Creating the Constraint Database</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#constraints-message">Constraints message</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#construction-options">Construction Options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#graph-size">Graph size</a></li>
<li class="toctree-l4"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#edges">Edges</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#database-construction">Database Construction</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../planning_with_approximated_constraint_manifolds/planning_with_approximated_constraint_manifolds_tutorial.html#database-loading-and-usage">Database Loading and Usage</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../pick_place/pick_place_tutorial.html">Pick and Place Tutorial</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#running-the-demo">Running The Demo</a></li>
<li class="toctree-l2"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#understanding-moveit-msgs-grasp">Understanding <tt class="docutils literal"><span class="pre">moveit_msgs::Grasp</span></tt></a></li>
<li class="toctree-l2"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#the-entire-code">The Entire Code</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#creating-environment">Creating Environment</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#pick-pipeline">Pick Pipeline</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-grasp-pose">Setting grasp pose</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-pre-grasp-approach">Setting pre-grasp approach</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-post-grasp-retreat">Setting post-grasp retreat</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-posture-of-eef-before-grasp">Setting posture of eef before grasp</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-posture-of-eef-during-grasp">Setting posture of eef during grasp</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#place-pipeline">Place Pipeline</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-place-location-pose">Setting place location pose</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-pre-place-approach">Setting pre-place approach</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#id2">Setting post-grasp retreat</a></li>
<li class="toctree-l4"><a class="reference internal" href="../pick_place/pick_place_tutorial.html#setting-posture-of-eef-after-placing-object">Setting posture of eef after placing object</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html">MoveIt! Setup Assistant</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#overview">Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-1-start">Step 1: Start</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-2-generate-self-collision-matrix">Step 2: Generate Self-Collision Matrix</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-3-add-virtual-joints">Step 3: Add Virtual Joints</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-4-add-planning-groups">Step 4: Add Planning Groups</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-5-add-robot-poses">Step 5: Add Robot Poses</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-6-label-end-effectors">Step 6: Label End Effectors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-7-add-passive-joints">Step 7: Add Passive Joints</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-8-3d-perception">Step 8: 3D Perception</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-9-gazebo-simulation">Step 9: Gazebo Simulation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-10-ros-control">Step 10: ROS Control</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-11-add-author-information">Step 11: Add Author Information</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#step-12-generate-configuration-files">Step 12: Generate Configuration Files</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#what-s-next">What&#8217;s Next</a></li>
<li class="toctree-l2"><a class="reference internal" href="../setup_assistant/setup_assistant_tutorial.html#additional-reading">Additional Reading</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html">URDF and SRDF</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#urdf">URDF</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#urdf-resources">URDF Resources</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#important-tips">Important Tips</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#special-characters-in-joint-names">Special Characters in Joint Names</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#safety-limits">Safety Limits</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#collision-checking">Collision Checking</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#test-your-urdf">Test your URDF</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#urdf-examples">URDF Examples</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#srdf">SRDF</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#virtual-joints">Virtual Joints</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#passive-joints">Passive Joints</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#groups">Groups</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#collection-of-joints">Collection of Joints</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#collection-of-links">Collection of Links</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#serial-chain">Serial Chain</a></li>
<li class="toctree-l4"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#collection-of-sub-groups">Collection of Sub-Groups</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#end-effectors">End-Effectors</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#self-collisions">Self-Collisions</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#robot-poses">Robot Poses</a></li>
<li class="toctree-l3"><a class="reference internal" href="../urdf_srdf/urdf_srdf_tutorial.html#srdf-documentation">SRDF Documentation</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html">Low Level Controllers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#yaml-configuration">YAML Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#followjointtrajectory-controller-interface">FollowJointTrajectory Controller Interface</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#grippercommand-controller-interface">GripperCommand Controller Interface</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#optional-allowed-trajectory-execution-duration-parameters">Optional Allowed Trajectory Execution Duration Parameters</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#create-the-controller-launch-file">Create the Controller launch file</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#debugging-information">Debugging Information</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#remapping-joint-states-topic">Remapping /joint_states topic</a></li>
<li class="toctree-l2"><a class="reference internal" href="../controller_configuration/controller_configuration_tutorial.html#trajectory-execution-manager-options">Trajectory Execution Manager Options</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="">Perception Pipeline Tutorial</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="#configuration">Configuration</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#yaml-configuration-file-point-cloud">YAML Configuration file (Point Cloud)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#yaml-configuration-file-depth-map">YAML Configuration file (Depth Map)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#update-the-launch-file">Update the launch file</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#add-the-yaml-file-to-the-launch-script">Add the YAML file to the launch script</a></li>
<li class="toctree-l4"><a class="reference internal" href="#octomap-configuration">Octomap Configuration</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#obstacle-avoidance">Obstacle Avoidance</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#running-the-interface">Running the Interface</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#detecting-and-adding-object-as-collision-object">Detecting and Adding Object as Collision Object</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#running-the-code">Running the Code</a></li>
<li class="toctree-l3"><a class="reference internal" href="#relevant-code">Relevant Code</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#perception-related">Perception Related</a></li>
<li class="toctree-l4"><a class="reference internal" href="#storing-relevant-cylinder-values">Storing Relevant Cylinder Values</a></li>
<li class="toctree-l4"><a class="reference internal" href="#extracting-location-and-height">Extracting Location and Height</a></li>
<li class="toctree-l4"><a class="reference internal" href="#adding-cylinder-to-planning-scene">Adding Cylinder to Planning Scene</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../ikfast/ikfast_tutorial.html">IKFast Kinematics Solver</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#what-is-ikfast">What is IKFast?</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#moveit-ikfast">MoveIt! IKFast</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#moveit-ikfast-installation">MoveIt! IKFast Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#openrave-installation">OpenRAVE Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#create-collada-file-for-use-with-openrave">Create Collada File For Use With OpenRAVE</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#parameters">Parameters</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#create-ikfast-solution-cpp-file">Create IKFast Solution CPP File</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#select-ik-type">Select IK Type</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#choose-planning-group">Choose Planning Group</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#identify-link-numbers">Identify Link Numbers</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#generate-ik-solver">Generate IK Solver</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#create-plugin">Create Plugin</a></li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#usage">Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#test-the-plugin">Test the Plugin</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../ikfast/ikfast_tutorial.html#updating-the-plugin">Updating the Plugin</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../trac_ik/trac_ik_tutorial.html">TRAC-IK Kinematics Solver</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../trac_ik/trac_ik_tutorial.html#install">Install</a></li>
<li class="toctree-l2"><a class="reference internal" href="../trac_ik/trac_ik_tutorial.html#usage">Usage</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html">Kinematics Configuration</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html#the-kinematics-yaml-file">The kinematics.yaml file</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html#parameters">Parameters</a></li>
<li class="toctree-l3"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html#the-kdl-kinematics-plugin">The KDL Kinematics Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html#the-lma-kinematics-plugin">The LMA Kinematics Plugin</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../kinematics_configuration/kinematics_configuration_tutorial.html#position-only-ik">Position Only IK</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../fake_controller_manager/fake_controller_manager_tutorial.html">Fake Controller Manager</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../fake_controller_manager/fake_controller_manager_tutorial.html#yaml-file-examples">YAML file examples</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../custom_constraint_samplers/custom_constraint_samplers_tutorial.html">Custom Constraint Samplers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../custom_constraint_samplers/custom_constraint_samplers_tutorial.html#overview">Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="../custom_constraint_samplers/custom_constraint_samplers_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../custom_constraint_samplers/custom_constraint_samplers_tutorial.html#creating-a-constraint-sampler">Creating a constraint sampler</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html">OMPL Planner</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#ompl-settings">OMPL Settings</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#longest-valid-segment-fraction">Longest Valid Segment Fraction</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#projection-evaluator">Projection Evaluator</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#enforce-planning-in-joint-space">Enforce Planning in Joint Space</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#other-settings">Other Settings</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#smoothing-paths">Smoothing Paths</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#determinism">Determinism</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#ompl-optimization-objectives">OMPL Optimization Objectives</a></li>
<li class="toctree-l3"><a class="reference internal" href="../ompl_interface/ompl_interface_tutorial.html#post-processing-smoothing">Post-Processing Smoothing</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html">CHOMP Planner</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#prerequisites">Prerequisites</a></li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#using-chomp-with-your-robot">Using CHOMP with Your Robot</a></li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#running-the-demo">Running the Demo</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#running-chomp-with-obstacles-in-the-scene">Running CHOMP with Obstacles in the Scene</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#tweaking-some-of-the-parameters-for-chomp">Tweaking some of the parameters for CHOMP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#difference-between-plans-obtained-by-chomp-and-ompl">Difference between plans obtained by CHOMP and OMPL</a></li>
<li class="toctree-l2"><a class="reference internal" href="../chomp_planner/chomp_planner_tutorial.html#using-ompl-as-a-pre-processor-for-chomp">Using OMPL as a pre-processor for CHOMP</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html">STOMP Planner</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#prerequisites">Prerequisites</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#installing-moveit-from-source">Installing MoveIt! from Source</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#using-stomp-with-your-robot">Using STOMP with Your Robot</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#running-the-demo">Running the Demo</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#running-stomp-with-obstacles-in-the-scene">Running STOMP with Obstacles in the Scene</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#tweaking-some-of-the-parameters-for-stomp">Tweaking some of the parameters for STOMP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#difference-between-plans-obtained-by-stomp-chomp-and-ompl">Difference between plans obtained by STOMP, CHOMP and OMPL</a></li>
<li class="toctree-l2"><a class="reference internal" href="../stomp_planner/stomp_planner_tutorial.html#running-stomp-unit-tests">Running STOMP Unit Tests</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html">Planning Adapter Tutorials</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#prerequisites">Prerequisites</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#installing-moveit-from-source">Installing MoveIt! from Source</a></li>
<li class="toctree-l2"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#using-planning-request-adapter-with-your-motion-planner">Using Planning Request Adapter with Your Motion Planner</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#running-ompl-as-a-pre-processor-for-chomp">Running OMPL as a pre-processor for CHOMP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#running-chomp-as-a-post-processor-for-stomp">Running CHOMP as a post-processor for STOMP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#running-ompl-as-a-pre-processor-for-stomp">Running OMPL as a pre-processor for STOMP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#running-stomp-as-a-post-processor-for-chomp">Running STOMP as a post-processor for CHOMP</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../planning_adapters/planning_adapters_tutorial.html#planning-insights-for-different-motion-planners-and-planners-with-planning-adapters">Planning Insights for different motion planners and planners with planning adapters</a></li>
</ul>
</li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../joystick_control_teleoperation/joystick_control_teleoperation_tutorial.html">Joystick Control Teleoperation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../joystick_control_teleoperation/joystick_control_teleoperation_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../joystick_control_teleoperation/joystick_control_teleoperation_tutorial.html#running-the-code">Running the Code</a></li>
<li class="toctree-l2"><a class="reference internal" href="../joystick_control_teleoperation/joystick_control_teleoperation_tutorial.html#joystick-command-mappings">Joystick Command Mappings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../joystick_control_teleoperation/joystick_control_teleoperation_tutorial.html#debugging">Debugging</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html">Benchmarking</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#example">Example</a></li>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#viewing-results">Viewing Results</a></li>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#parameters-of-the-benchmarkoptions-class">Parameters of the BenchmarkOptions Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#parameters-of-the-benchmarkexecutor-class">Parameters of the BenchmarkExecutor Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#benchmarking-of-different-motion-planners-chomp-stomp-and-ompl">Benchmarking of Different Motion Planners: CHOMP, STOMP and OMPL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#benchmarking-in-a-scene-without-obstacles">Benchmarking in a scene without obstacles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../benchmarking/benchmarking_tutorial.html#benchmarking-in-a-scene-with-obstacles">Benchmarking in a scene with obstacles</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../tests/tests_tutorial.html">Integration/Unit Tests</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#getting-started">Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#integration-test">Integration Test</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#test-robots">Test Robots</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#unit-tests">Unit Tests</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../tests/tests_tutorial.html#writing-unit-tests">Writing Unit Tests</a></li>
<li class="toctree-l3"><a class="reference internal" href="../tests/tests_tutorial.html#running-unit-tests">Running Unit Tests</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#kinematic-tests">Kinematic Tests</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tests/tests_tutorial.html#code-coverage">Code Coverage</a></li>
</ul>
</li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../../index.html">moveit_tutorials</a>
      </nav>

      
      <div class="wy-nav-content">
        <div class="header-override">
          <p>
            <a href="http://moveit.ros.org">MoveIt! Website</a><br/>
          </p>
        </div>
        <div class="rst-content">
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li class="wy-breadcrumbs-aside">
      
        
          <a href="https://github.com/ros-planning/moveit_tutorials/blob/melodic-devel/doc/perception_pipeline/perception_pipeline_tutorial.rst" class="fa fa-github"> Edit on GitHub</a>
        
      
    </li>
    <li><a href="../../index.html">Docs</a> &raquo;</li>
      
    <li>Perception Pipeline Tutorial</li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
             <!-- <div class="admonition note">  -->
               <!-- <p class="first admonition-title">Code Used in this Tutorial Available</p>  -->
               <!-- <p class="last">Code can be found at <a href = "https://github.com/ros-planning/moveit_tutorials">moveit_tutorials repository</a> in doc folder. Use melodic-devel branch.</p> -->
             <!-- </div>  -->
            
  <div class="section" id="perception-pipeline-tutorial">
<h1>Perception Pipeline Tutorial<a class="headerlink" href="#perception-pipeline-tutorial" title="Permalink to this headline">¶</a></h1>
<p>MoveIt! allows for seamless integration of 3D sensors using <a class="reference external" href="http://octomap.github.io/">Octomap</a>.
Once properly configured, you should see something like this in rviz:</p>
<a class="reference internal image-reference" href="../../_images/perception_configuration_demo.png"><img alt="../../_images/perception_configuration_demo.png" src="../../_images/perception_configuration_demo.png" style="width: 700px;" /></a>
<div class="section" id="getting-started">
<h2>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h2>
<p>If you haven&#8217;t already done so, make sure you&#8217;ve completed the steps in <a class="reference external" href="../getting_started/getting_started.html">Getting Started</a>.</p>
</div>
<div class="section" id="configuration">
<h2>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h2>
<p>In this section, we will walk through configuring the 3D sensors on your robot with MoveIt!. The primary component in MoveIt! that deals with 3D perception is the Occupancy Map Updater. The updater uses a plugin architecture to process different types of input. The currently available plugins in MoveIt! are:</p>
<ul class="simple">
<li>The PointCloud Occupancy Map Updater: which can take as input point clouds (<tt class="docutils literal"><span class="pre">sensor_msgs/PointCloud2</span></tt>)</li>
<li>The Depth Image Occupancy Map Updater: which can take as input Depth Images (<tt class="docutils literal"><span class="pre">sensor_msgs/Image</span></tt>)</li>
</ul>
<div class="section" id="yaml-configuration-file-point-cloud">
<h3>YAML Configuration file (Point Cloud)<a class="headerlink" href="#yaml-configuration-file-point-cloud" title="Permalink to this headline">¶</a></h3>
<p>We will have to generate a YAML configuration file for configuring the 3D sensors. Please see <a class="reference external" href="https://github.com/ros-planning/panda_moveit_config/blob/melodic-devel/config/sensors_kinect_pointcloud.yaml">this example file</a> for processing point clouds, located in the <a class="reference external" href="https://github.com/ros-planning/panda_moveit_config">panda_moveit_config repository for Melodic</a>.
Save this file in the config folder in the robot&#8217;s moveit_config package with name &#8220;sensors_kinect_pointcloud.yaml&#8221;:</p>
<div class="highlight-python"><div class="highlight"><pre>sensors:
  - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater
    point_cloud_topic: /camera/depth_registered/points
    max_range: 5.0
    point_subsample: 1
    padding_offset: 0.1
    padding_scale: 1.0
    max_update_rate: 1.0
    filtered_cloud_topic: filtered_cloud
</pre></div>
</div>
<p><strong>The general parameters are:</strong></p>
<ul class="simple">
<li><em>sensor_plugin</em>: The name of the plugin that we are using.</li>
<li><em>max_update_rate</em>: The octomap representation will be updated at rate less than or equal to this value.</li>
</ul>
<p><strong>Parameters specific to the Point cloud updater are:</strong></p>
<ul class="simple">
<li><em>point_cloud_topic</em>: This specifies the topic to listen on for a point cloud.</li>
<li><em>max_range</em>: (in m) Points further than this will not be used.</li>
<li><em>point_subsample</em>: Choose one of every <em>point_subsample</em> points.</li>
<li><em>padding_offset</em>: The size of the padding (in cm).</li>
<li><em>padding_scale</em>: The scale of the padding.</li>
<li><em>filtered_cloud_topic</em>: The topic on which the filtered cloud will be published (mainly for debugging). The filtering cloud is the resultant cloud after self-filtering has been performed.</li>
</ul>
</div>
<div class="section" id="yaml-configuration-file-depth-map">
<h3>YAML Configuration file (Depth Map)<a class="headerlink" href="#yaml-configuration-file-depth-map" title="Permalink to this headline">¶</a></h3>
<p>We will have to generate a YAML configuration file for configuring the 3D sensors. An <a class="reference external" href="https://github.com/ros-planning/panda_moveit_config/blob/melodic-devel/config/sensors_kinect_depthmap.yaml">example file for processing depth images</a> can be found in the <a class="reference external" href="https://github.com/ros-planning/panda_moveit_config">panda_moveit_config repository</a> as well.
Save this file in the config folder in the robot&#8217;s moveit_config package with name &#8220;sensors_kinect_depthmap.yaml&#8221;:</p>
<div class="highlight-python"><div class="highlight"><pre>sensors:
  - sensor_plugin: occupancy_map_monitor/DepthImageOctomapUpdater
    image_topic: /camera/depth_registered/image_raw
    queue_size: 5
    near_clipping_plane_distance: 0.3
    far_clipping_plane_distance: 5.0
    shadow_threshold: 0.2
    padding_scale: 4.0
    padding_offset: 0.03
    max_update_rate: 1.0
    filtered_cloud_topic: filtered_cloud
</pre></div>
</div>
<p><strong>The general parameters are:</strong></p>
<ul class="simple">
<li><em>sensor_plugin</em>: The name of the plugin that we are using.</li>
<li><em>max_update_rate</em>: The octomap representation will be updated at rate less than or equal to this value.</li>
</ul>
<p><strong>Parameters specific to the Depth Map updater are:</strong></p>
<ul class="simple">
<li><em>image_topic</em>: This specifies the topic to listen on for a depth image.</li>
<li><em>queue_size</em>: The number of images to queue up.</li>
<li><em>near_clipping_plane_distance</em>: The minimum distance before lack of visibility.</li>
<li><em>far_clipping_plane_distance</em>: The maximum distance before lack of visibility.</li>
<li><em>shadow_threshold</em>: The minimum brightness of the shadow map below an entity for its dynamic shadow to be visible</li>
<li><em>padding_offset</em>: The size of the padding (in cm).</li>
<li><em>padding_scale</em>: The scale of the padding.</li>
<li><em>filtered_cloud_topic</em>: The topic on which the filtered cloud will be published (mainly for debugging). The filtering cloud is the resultant cloud after self-filtering has been performed.</li>
</ul>
</div>
<div class="section" id="update-the-launch-file">
<h3>Update the launch file<a class="headerlink" href="#update-the-launch-file" title="Permalink to this headline">¶</a></h3>
<div class="section" id="add-the-yaml-file-to-the-launch-script">
<h4>Add the YAML file to the launch script<a class="headerlink" href="#add-the-yaml-file-to-the-launch-script" title="Permalink to this headline">¶</a></h4>
<p>You will now need to update the <em>sensor_manager.launch</em> file in the &#8220;launch&#8221; directory of your panda_moveit_config directory with this sensor information (this file is auto-generated by the Setup Assistant but is empty). You will need to add the following line into that file to configure the set of sensor sources for MoveIt! to use:</p>
<div class="highlight-python"><div class="highlight"><pre>&lt;rosparam command=&quot;load&quot; file=&quot;$(find panda_moveit_config)/config/sensors_kinect_pointcloud.yaml&quot; /&gt;
</pre></div>
</div>
<p>If you are using depthmap change the name of the yaml file to <tt class="docutils literal"><span class="pre">sensors_kinect_depthmap.yaml</span></tt>.
Note that you will need to input the path to the right file you have created above.</p>
</div>
<div class="section" id="octomap-configuration">
<h4>Octomap Configuration<a class="headerlink" href="#octomap-configuration" title="Permalink to this headline">¶</a></h4>
<p>You will also need to configure the <a class="reference external" href="http://octomap.github.io/">Octomap</a> by adding the following lines into the <em>sensor_manager.launch</em>:</p>
<div class="highlight-python"><div class="highlight"><pre>&lt;param name=&quot;octomap_frame&quot; type=&quot;string&quot; value=&quot;odom_combined&quot; /&gt;
&lt;param name=&quot;octomap_resolution&quot; type=&quot;double&quot; value=&quot;0.05&quot; /&gt;
&lt;param name=&quot;max_range&quot; type=&quot;double&quot; value=&quot;5.0&quot; /&gt;
</pre></div>
</div>
<dl class="docutils">
<dt>MoveIt! uses an octree-based framework to represent the world around it. The <em>Octomap</em> parameters above are configuration parameters for this representation:</dt>
<dd><ul class="first last simple">
<li><em>octomap_frame</em>: specifies the coordinate frame in which this representation will be stored. If you are working with a mobile robot, this frame should be a fixed frame in the world.</li>
<li><em>octomap_resolution</em>: specifies the resolution at which this representation is maintained (in meters).</li>
<li><em>max_range</em>: specifies the maximum range value to be applied for any sensor input to this node.</li>
</ul>
</dd>
</dl>
</div>
</div>
</div>
<div class="section" id="obstacle-avoidance">
<h2>Obstacle Avoidance<a class="headerlink" href="#obstacle-avoidance" title="Permalink to this headline">¶</a></h2>
<p>If you set the initial and the final location of the robot in a way that there is no straight path between them, then the planner will automatically avoid the octomap and plan around it.</p>
<a class="reference internal image-reference" href="../../_images/obstacle_avoidance.gif"><img alt="../../_images/obstacle_avoidance.gif" src="../../_images/obstacle_avoidance.gif" style="width: 700px;" /></a>
<div class="section" id="running-the-interface">
<h3>Running the Interface<a class="headerlink" href="#running-the-interface" title="Permalink to this headline">¶</a></h3>
<p>Roslaunch the launch file to run the code directly from moveit_tutorials:</p>
<div class="highlight-python"><div class="highlight"><pre>roslaunch moveit_tutorials obstacle_avoidance_demo.launch
</pre></div>
</div>
<p>you should see something like the image shown at the beginning of this tutorial.</p>
<p>You can test obstacle avoidance for yourself by setting the goal state manually and then planning and executing. To learn how to do that look at <a class="reference external" href="../quickstart_in_rviz/quickstart_in_rviz_tutorial.html">MoveIt! Quickstart in RViz</a></p>
</div>
</div>
<div class="section" id="detecting-and-adding-object-as-collision-object">
<h2>Detecting and Adding Object as Collision Object<a class="headerlink" href="#detecting-and-adding-object-as-collision-object" title="Permalink to this headline">¶</a></h2>
<p>In this section, we will demonstrate an example of extracting a cylinder from a pointcloud, computing relevant values and adding it as a collision object to the planning scene.
We will be working with point clouds but it can be implemented similarly with depth maps.</p>
<p>After running the code, you should be able to see something like this in rviz:</p>
<a class="reference internal image-reference" href="../../_images/cylinder_collision_object.png"><img alt="../../_images/cylinder_collision_object.png" src="../../_images/cylinder_collision_object.png" style="width: 700px;" /></a>
<div class="section" id="running-the-code">
<h3>Running the Code<a class="headerlink" href="#running-the-code" title="Permalink to this headline">¶</a></h3>
<p>Roslaunch the launch file to run the code directly from moveit_tutorials:</p>
<div class="highlight-python"><div class="highlight"><pre>roslaunch moveit_tutorials detect_and_add_cylinder_collision_object_demo.launch
</pre></div>
</div>
<p>KNOWN ISSUE - You may see the following error when running the demo</p>
<div class="highlight-python"><div class="highlight"><pre>ros.moveit_ros_planning.planning_scene_monitor: Transform error: Lookup would require extrapolation into the future.  Requested time 1527473962.793050157 but the latest data is at time 1527473962.776993978, when looking up transform from frame [panda_link2] to frame [camera_rgb_optical_frame]
ros.moveit_ros_perception: Transform cache was not updated. Self-filtering may fail.
</pre></div>
</div>
<p>We are working on fixing it, it should not break the working of the demo.
You can follow its status in the <a class="reference external" href="https://github.com/ros-planning/moveit_tutorials/issues/192">issue tracker</a></p>
</div>
<div class="section" id="relevant-code">
<h3>Relevant Code<a class="headerlink" href="#relevant-code" title="Permalink to this headline">¶</a></h3>
<p>The entire code can be seen <a class="reference external" href="https://github.com/ros-planning/moveit_tutorials/tree/melodic-devel/doc/perception_pipeline">here</a> in the moveit_tutorials GitHub project. The details regarding the implementation of each of the perception pipeline function have been omitted in this tutorial as they are well documented <a class="reference external" href="http://wiki.ros.org/pcl/Tutorials">here.</a></p>
<div class="section" id="perception-related">
<h4>Perception Related<a class="headerlink" href="#perception-related" title="Permalink to this headline">¶</a></h4>
<p>First, convert from sensor_msgs to pcl::PointXYZRGB which is needed for most of the processing.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGB</span><span class="o">&gt;::</span><span class="n">Ptr</span> <span class="n">cloud</span><span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGB</span><span class="o">&gt;</span><span class="p">);</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">fromROSMsg</span><span class="p">(</span><span class="o">*</span><span class="n">input</span><span class="p">,</span> <span class="o">*</span><span class="n">cloud</span><span class="p">);</span>
</pre></div>
</div>
<p>Using passthough filter to get region of interest. A passthrough filter just eliminates the point cloud values
which do not lie in the user specified range.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">passThroughFilter</span><span class="p">(</span><span class="n">cloud</span><span class="p">);</span>
</pre></div>
</div>
<p>Declare normals and call function to compute point normals.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">Normal</span><span class="o">&gt;::</span><span class="n">Ptr</span> <span class="n">cloud_normals</span><span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">Normal</span><span class="o">&gt;</span><span class="p">);</span>
<span class="n">computeNormals</span><span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="n">cloud_normals</span><span class="p">);</span>
</pre></div>
</div>
<p>inliers_plane will hold the indices of the point cloud that correspond to a plane.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">pcl</span><span class="o">::</span><span class="n">PointIndices</span><span class="o">::</span><span class="n">Ptr</span> <span class="n">inliers_plane</span><span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointIndices</span><span class="p">);</span>
</pre></div>
</div>
<p>Detect and eliminate the plane on which the cylinder is kept to ease the process of finding the cylinder.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">removePlaneSurface</span><span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="n">inliers_plane</span><span class="p">);</span>
</pre></div>
</div>
<p>We had calculated the point normals in a previous call to computeNormals,
now we will be extracting the normals that correspond to the plane on which cylinder lies.
It will be used to extract the cylinder.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">extractNormals</span><span class="p">(</span><span class="n">cloud_normals</span><span class="p">,</span> <span class="n">inliers_plane</span><span class="p">);</span>
</pre></div>
</div>
<p>ModelCoefficients will hold the parameters using which we can define a cylinder of infinite length.
It has a public attribute <code> values</code> of type <code> std::vector&lt; float &gt;</code>.
<br />
<code> Values[0-2]</code> hold a point on the center line of the cylinder. <br />
<code> Values[3-5]</code> hold direction vector of the z-axis. <br />
<code> Values[6]</code> is the radius of the cylinder.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">pcl</span><span class="o">::</span><span class="n">ModelCoefficients</span><span class="o">::</span><span class="n">Ptr</span> <span class="n">coefficients_cylinder</span><span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">ModelCoefficients</span><span class="p">);</span>
<span class="cm">/* Extract the cylinder using SACSegmentation. */</span>
<span class="n">extractCylinder</span><span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="n">coefficients_cylinder</span><span class="p">,</span> <span class="n">cloud_normals</span><span class="p">);</span>
</pre></div>
</div>
</div>
<div class="section" id="storing-relevant-cylinder-values">
<h4>Storing Relevant Cylinder Values<a class="headerlink" href="#storing-relevant-cylinder-values" title="Permalink to this headline">¶</a></h4>
<p>The information that we have in <code> coefficients_cylinder</code> is not enough to define our
cylinder.
It does not have the actual location of the cylinder nor the actual height. <br />
We define a struct to hold the parameters that are actually needed for defining a collision object completely.
<br />
There are 4 fields and a total of 7 parameters used to define this.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="k">struct</span> <span class="n">AddCylinderParams</span>
<span class="p">{</span>
  <span class="cm">/* Radius of the cylinder. */</span>
  <span class="kt">double</span> <span class="n">radius</span><span class="p">;</span>
  <span class="cm">/* Direction vector towards the z-axis of the cylinder. */</span>
  <span class="kt">double</span> <span class="n">direction_vec</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
  <span class="cm">/* Center point of the cylinder. */</span>
  <span class="kt">double</span> <span class="n">center_pt</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
  <span class="cm">/* Height of the cylinder. */</span>
  <span class="kt">double</span> <span class="n">height</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>
</div>
<p>Declare a variable of type AddCylinderParams and store relevant values from ModelCoefficients.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">AddCylinderParams</span><span class="o">*</span> <span class="n">cylinder_params</span><span class="p">;</span>
    <span class="cm">/* Store the radius of the cylinder. */</span>
    <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">radius</span> <span class="o">=</span> <span class="n">coefficients_cylinder</span><span class="o">-&gt;</span><span class="n">values</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
    <span class="cm">/* Store direction vector of z-axis of cylinder. */</span>
    <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">coefficients_cylinder</span><span class="o">-&gt;</span><span class="n">values</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
    <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">coefficients_cylinder</span><span class="o">-&gt;</span><span class="n">values</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
    <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">coefficients_cylinder</span><span class="o">-&gt;</span><span class="n">values</span><span class="p">[</span><span class="mi">5</span><span class="p">];</span>
</pre></div>
</div>
</div>
<div class="section" id="extracting-location-and-height">
<h4>Extracting Location and Height<a class="headerlink" href="#extracting-location-and-height" title="Permalink to this headline">¶</a></h4>
<p>Compute the center point of the cylinder using standard geometry</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">extractLocationHeight</span><span class="p">(</span><span class="n">cloud</span><span class="p">);</span>
</pre></div>
</div>
<p>Consider a point inside the point cloud and imagine that point is formed on a XY plane where the perpendicular
distance from the plane to the camera is Z. <br />
The perpendicular drawn from the camera to the plane hits at center of the XY plane. <br />
We have the x and y coordinate of the point which is formed on the XY plane. <br />
X is the horizontal axis and Y is the vertical axis. <br />
C is the center of the plane which is Z meter away from the center of camera and A is any point on the plane.
<br />
Now we know Z is the perpendicular distance from the point to the camera. <br />
If you need to find the  actual distance d from the point to the camera, you should calculate the hypotenuse-
<code> hypot(point.z, point.x);</code> <br />
angle the point made horizontally- <code> atan2(point.z,point.x);</code> <br />
angle the point made Vertically- <code> atan2(point.z, point.y);</code> <br />
Loop over the entire pointcloud.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="k">const</span> <span class="n">point</span> <span class="o">:</span> <span class="n">cloud</span><span class="o">-&gt;</span><span class="n">points</span><span class="p">)</span>
<span class="p">{</span>
  <span class="cm">/* Find the coordinates of the highest point */</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">atan2</span><span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">,</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">min_angle_y</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">min_angle_y</span> <span class="o">=</span> <span class="n">atan2</span><span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">,</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
    <span class="n">lowest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
    <span class="n">lowest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
    <span class="n">lowest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="cm">/* Find the coordinates of the lowest point */</span>
  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">atan2</span><span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">,</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">max_angle_y</span><span class="p">)</span>
  <span class="p">{</span>
    <span class="n">max_angle_y</span> <span class="o">=</span> <span class="n">atan2</span><span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">,</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">);</span>
    <span class="n">highest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">x</span><span class="p">;</span>
    <span class="n">highest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
    <span class="n">highest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">.</span><span class="n">z</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
<span class="cm">/* Store the center point of cylinder */</span>
<span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">highest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">lowest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
<span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">highest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">lowest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
<span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">highest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="n">lowest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
<span class="cm">/* Store the height of cylinder */</span>
<span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">height</span> <span class="o">=</span>
    <span class="n">sqrt</span><span class="p">(</span><span class="n">pow</span><span class="p">((</span><span class="n">lowest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">highest_point</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">pow</span><span class="p">((</span><span class="n">lowest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">highest_point</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span>
         <span class="n">pow</span><span class="p">((</span><span class="n">lowest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">highest_point</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span> <span class="mi">2</span><span class="p">));</span>
</pre></div>
</div>
<p>Use the parameters extracted to add the cylinder to the planning scene as a collision object.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">addCylinder</span><span class="p">();</span>
</pre></div>
</div>
</div>
<div class="section" id="adding-cylinder-to-planning-scene">
<h4>Adding Cylinder to Planning Scene<a class="headerlink" href="#adding-cylinder-to-planning-scene" title="Permalink to this headline">¶</a></h4>
<p>Define a collision object ROS message.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">moveit_msgs</span><span class="o">::</span><span class="n">CollisionObject</span> <span class="n">collision_object</span><span class="p">;</span>
<span class="n">collision_object</span><span class="p">.</span><span class="n">header</span><span class="p">.</span><span class="n">frame_id</span> <span class="o">=</span> <span class="s">&quot;camera_rgb_optical_frame&quot;</span><span class="p">;</span>
<span class="n">collision_object</span><span class="p">.</span><span class="n">id</span> <span class="o">=</span> <span class="s">&quot;cylinder&quot;</span><span class="p">;</span>
</pre></div>
</div>
<p>Define a cylinder which will be added to the world.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">shape_msgs</span><span class="o">::</span><span class="n">SolidPrimitive</span> <span class="n">primitive</span><span class="p">;</span>
<span class="n">primitive</span><span class="p">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">primitive</span><span class="p">.</span><span class="n">CYLINDER</span><span class="p">;</span>
<span class="n">primitive</span><span class="p">.</span><span class="n">dimensions</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="cm">/* Setting height of cylinder. */</span>
<span class="n">primitive</span><span class="p">.</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">height</span><span class="p">;</span>
<span class="cm">/* Setting radius of cylinder. */</span>
<span class="n">primitive</span><span class="p">.</span><span class="n">dimensions</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">radius</span><span class="p">;</span>
</pre></div>
</div>
<p>Define a pose for the cylinder (specified relative to frame_id).</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">geometry_msgs</span><span class="o">::</span><span class="n">Pose</span> <span class="n">cylinder_pose</span><span class="p">;</span>
<span class="cm">/* Computing and setting quaternion from axis angle representation. */</span>
<span class="n">Eigen</span><span class="o">::</span><span class="n">Vector3d</span> <span class="n">cylinder_z_direction</span><span class="p">(</span><span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
                                     <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">direction_vec</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
<span class="n">Eigen</span><span class="o">::</span><span class="n">Vector3d</span> <span class="n">origin_z_direction</span><span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">0.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">);</span>
<span class="n">Eigen</span><span class="o">::</span><span class="n">Vector3d</span> <span class="n">axis</span><span class="p">;</span>
<span class="n">axis</span> <span class="o">=</span> <span class="n">origin_z_direction</span><span class="p">.</span><span class="n">cross</span><span class="p">(</span><span class="n">cylinder_z_direction</span><span class="p">);</span>
<span class="n">axis</span><span class="p">.</span><span class="n">normalize</span><span class="p">();</span>
<span class="kt">double</span> <span class="n">angle</span> <span class="o">=</span> <span class="n">acos</span><span class="p">(</span><span class="n">cylinder_z_direction</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">origin_z_direction</span><span class="p">));</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">orientation</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">axis</span><span class="p">.</span><span class="n">x</span><span class="p">()</span> <span class="o">*</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">orientation</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">axis</span><span class="p">.</span><span class="n">y</span><span class="p">()</span> <span class="o">*</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">orientation</span><span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="n">axis</span><span class="p">.</span><span class="n">z</span><span class="p">()</span> <span class="o">*</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">orientation</span><span class="p">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">cos</span><span class="p">(</span><span class="n">angle</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
</pre></div>
</div>
<p>Setting the position of cylinder.</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">cylinder_pose</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="n">cylinder_pose</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="n">cylinder_params</span><span class="o">-&gt;</span><span class="n">center_pt</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</pre></div>
</div>
<p>Add cylinder as collision object</p>
<div class="highlight-c++"><div class="highlight"><pre><span class="n">collision_object</span><span class="p">.</span><span class="n">primitives</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">primitive</span><span class="p">);</span>
<span class="n">collision_object</span><span class="p">.</span><span class="n">primitive_poses</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">cylinder_pose</span><span class="p">);</span>
<span class="n">collision_object</span><span class="p">.</span><span class="n">operation</span> <span class="o">=</span> <span class="n">collision_object</span><span class="p">.</span><span class="n">ADD</span><span class="p">;</span>
<span class="n">planning_scene_interface</span><span class="p">.</span><span class="n">applyCollisionObject</span><span class="p">(</span><span class="n">collision_object</span><span class="p">);</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>


            
            <div class="admonition note">
              <p class="first admonition-title">Open Source Feedback</p>
              <p class="last">See something that needs improvement? Please open a pull request on this <a href="https://github.com/ros-planning/moveit_tutorials/blob/melodic-devel/doc/perception_pipeline/perception_pipeline_tutorial.rst" class="fa fa-github"> GitHub page</a></p>
            </div>
            
           </div>
          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="../ikfast/ikfast_tutorial.html" class="btn btn-neutral float-right" title="IKFast Kinematics Solver" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="../controller_configuration/controller_configuration_tutorial.html" class="btn btn-neutral" title="Low Level Controllers" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.

</footer>
        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../../',
            VERSION:'Kinetic',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../../_static/jquery.js"></script>
      <script type="text/javascript" src="../../_static/underscore.js"></script>
      <script type="text/javascript" src="../../_static/doctools.js"></script>

  

  
  
    <script type="text/javascript" src="../../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

</body>
</html>